昨天講了 Faiss + sqlite,今天來講另一個向量資料庫 Milvus。
Milvis 初次活躍是在 2019 年,其宣稱可以處理萬億級別的向量資料,並且可以處理,圖像、音樂、影片等等的資訊,隨著互聯網的發展和演變,非結構化數據越來越普遍,包括電子郵件、論文、物聯網感測器數據、Facebook 照片、蛋白質結構等。為了讓計算機理解和處理這些非結構化數據,這些數據使用嵌入技術轉換成向量。Milvus 儲存並索引這些向量,並通過計算它們的相似度來分析兩個向量之間的相關性。如果兩個嵌入向量非常相似,則意味著原始數據來源也非常相似。
那這個開源軟體呢,提供了雲服務以及 Docker 兩種部屬方式,這邊由於不使用雲服務去管理,所以我們直接果斷地使用 Docker 的部屬方式。
官方提供了 Shell script 的安裝方式,所以這邊限定 Linux 系統的使用者進行安裝。
# Download the installation script
curl -sfL https://raw.githubusercontent.com/milvus-io/milvus/master/scripts/standalone_embed.sh -o standalone_embed.sh
# Start the Docker container
bash standalone_embed.sh start
等待終端出現 Start successfully.
後即可開始進行操作。
程式操作的部份我們也使用 Langchain 的 milvus 模塊~~
pip install langchain_milvus langchain-community
文字資料我們也使用前一天使用的文檔!
from pymilvus import MilvusClient
from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import CharacterTextSplitter
client = MilvusClient(
uri="http://<milvus_server_ip>:19530"
)
client.create_collection(
collection_name="License_sample",
dimension=384
)
loader = TextLoader("./license.txt")
text_splitter = CharacterTextSplitter(chunk_size=300, chunk_overlap=30)
docs = text_splitter.split_documents(loader.load())
data_temp = [record.page_content for record in docs]
line 6: 記得把 IP 改成部屬 Docker 容器的主機位置
再來比較特別,我們需要手動將我們的文本資料,轉換成詞向量,並且重新將轉換出來的向量資料,轉換成 milvus 的 collection 能接受的格式
embeddings = HuggingFaceBgeEmbeddings(
model_name = "sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2",
model_kwargs = {'device': 'cpu'},
encode_kwargs = {'normalize_embeddings': True}
)
embed_docs = embeddings.embed_documents(data_temp)
data = []
for index in range(len(embed_docs)):
data.append({"id": index, "vector": embed_docs[index]})
輸入資料的部份就直接使用 insert 方法插入就可以了
client.insert(
collection_name="License_sample",
data=data
)
資料前處理準備就緒後,我們就可以進行相似搜尋的部份了
from langchain_milvus.vectorstores import Milvus
from langchain_community.embeddings import HuggingFaceBgeEmbeddings
embeddings = HuggingFaceBgeEmbeddings(
model_name = "sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2",
model_kwargs = {'device': 'cpu'},
encode_kwargs = {'normalize_embeddings': True}
)
session = Milvus(
embeddings,
connection_args={"host": "<milvus_server_ip>", "port": "19530"},
collection_name="License_sample"
)
results = session.similarity_search("Apache")
print(results[0].page_content)
"""
重點規則:
散佈時要附上 Apache 2.0 授權
衍生作品不需要開源
專利授權方面允許製造、使用、販售等多種權利
可為使用者提供擔保、支援服務等,但是不得使用其他貢獻者的名義擔保或背書支援服務
明確說明授權不處理商標權
關於 Apache 2.0 與 BSD 的差異可以參考這篇林懿萱著作的《化簡為繁的 Apache-2.0 授權條款》。
MPL 2.0 授權
https://opensource.org/licenses/MPL-2.0
"""